import { useEnumStore } from '@/store/modules/enum'
import type { EnumItem, EnumType } from '@/types/enum'

/**
 * 获取枚举列表（带缓存机制）
 * @param type 枚举类型
 * @returns 枚举项数组
 * @example
 * ```ts
 * // 获取场站启用状态枚举
 * const stationEnableList = await getEnumListByTypeList('stationEnable')
 * 
 * // 获取设备状态枚举
 * const deviceStatusList = await getEnumListByTypeList('deviceStatus')
 * ```
 */
export async function getEnumListByTypeList(type: EnumType): Promise<EnumItem[]> {
  const enumStore = useEnumStore()
  return await enumStore.loadEnum(type)
}

/**
 * 批量获取枚举列表（带缓存机制）
 * @param types 枚举类型数组
 * @returns 枚举映射对象
 * @example
 * ```ts
 * // 批量获取多个枚举
 * const enums = await getEnumListByTypeLists(['stationEnable', 'deviceStatus', 'orderStatus'])
 * // 结果: { stationEnable: [...], deviceStatus: [...], orderStatus: [...] }
 * ```
 */
export async function getEnumListByTypeLists(types: EnumType[]): Promise<Record<string, EnumItem[]>> {
  const enumStore = useEnumStore()
  return await enumStore.loadEnums(types)
}

/**
 * 获取枚举标签
 * @param type 枚举类型
 * @param value 枚举值
 * @returns 枚举标签，未找到返回空字符串
 * @example
 * ```ts
 * const label = getEnumLabel('stationEnable', '1') // 返回 "启用"
 * ```
 */
export function getEnumLabel(type: EnumType, value: string | number): string {
  const enumStore = useEnumStore()
  const list = enumStore.getEnumList(type)
  const item = list.find(item => String(item.value) === String(value))
  return item?.label || ''
}

/**
 * 获取枚举值
 * @param type 枚举类型
 * @param label 枚举标签
 * @returns 枚举值，未找到返回空字符串
 * @example
 * ```ts
 * const value = getEnumValue('stationEnable', '启用') // 返回 "1"
 * ```
 */
export function getEnumValue(type: EnumType, label: string): string | number {
  const enumStore = useEnumStore()
  const list = enumStore.getEnumList(type)
  const item = list.find(item => item.label === label)
  return item?.value || ''
}

/**
 * 检查枚举是否已加载
 * @param type 枚举类型
 * @returns 是否已加载
 */
export function isEnumLoaded(type: EnumType): boolean {
  const enumStore = useEnumStore()
  return enumStore.isEnumLoaded(type)
}

/**
 * 重新加载枚举（清除缓存后重新获取）
 * @param type 枚举类型
 * @returns 枚举项数组
 */
export async function reloadEnum(type: EnumType): Promise<EnumItem[]> {
  const enumStore = useEnumStore()
  return await enumStore.reloadEnum(type)
}

/**
 * 将枚举列表转换为Map
 * @param type 枚举类型
 * @returns 枚举Map对象
 * @example
 * ```ts
 * const enumMap = getEnumMap('stationEnable')
 * // 结果: { '0': '禁用', '1': '启用' }
 * ```
 */
export function getEnumMap(type: EnumType): Record<string | number, string> {
  const enumStore = useEnumStore()
  const list = enumStore.getEnumList(type)
  const map: Record<string | number, string> = {}
  
  list.forEach(item => {
    map[item.value] = item.label
  })
  
  return map
}

/**
 * 将枚举列表转换为Select选项格式
 * @param type 枚举类型
 * @returns Select选项数组
 * @example
 * ```ts
 * const options = getEnumOptions('stationEnable')
 * // 结果: [{ label: '禁用', value: '0' }, { label: '启用', value: '1' }]
 * ```
 */
export function getEnumOptions(type: EnumType): { label: string; value: string | number }[] {
  const enumStore = useEnumStore()
  const list = enumStore.getEnumList(type)
  return list.map(item => ({
    label: item.label,
    value: item.value
  }))
}

/**
 * 组合式函数：使用枚举
 * @param type 枚举类型
 * @returns 枚举相关方法和数据
 */
export function useEnum(type: EnumType) {
  const enumStore = useEnumStore()
  
  // 计算属性
  const enumList = computed(() => enumStore.getEnumList(type))
  const isLoaded = computed(() => enumStore.isEnumLoaded(type))
  const isLoading = computed(() => enumStore.loading[type] || false)
  const error = computed(() => enumStore.errors[type] || '')
  
  // 方法
  const load = () => enumStore.loadEnum(type)
  const reload = () => enumStore.reloadEnum(type)
  
  // 工具方法
  const getLabel = (value: string | number) => getEnumLabel(type, value)
  const getValue = (label: string) => getEnumValue(type, label)
  const toMap = () => getEnumMap(type)
  const toOptions = () => getEnumOptions(type)
  
  return {
    enumList,
    isLoaded,
    isLoading,
    error,
    load,
    reload,
    getLabel,
    getValue,
    toMap,
    toOptions
  }
}